package br.com.admGearman.consulta.negocio;

import java.util.HashMap;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;

import br.com.admGearman.cadastro.negocio.DatasNgc;
import br.com.admGearman.cadastro.vo.DatasVo;
import br.com.admGearman.consulta.vo.ControleLogBaixaVo;
import br.com.r2.exception.R2Exception;
import br.com.r2.util.hibernate.business.R2HbNgc;
import br.com.r2.util.hibernate.business.RestritorHb;

public class ControleLogBaixaNgc extends R2HbNgc<ControleLogBaixaVo>
{

   private Map filtroPropriedade = new HashMap();

   private Map restritores = new HashMap();

   public static final int JOIN_EST_EMPRESA = 1;

   public static final int JOIN_BANDEIRA = 2;

   public static final int JOIN_LOJA = 4;

   public static final int JOIN_REDE = 8;

   public static final int JOIN_DATA_VENDA = 16;

   public static final int JOIN_DATA_PAGAMENTO = 64;

   public static final int JOIN_LOTE_BANDEIRA = 128;

   public static final int JOIN_ARQUIVO = 256;

   private static ControleLogBaixaNgc instancia = null;

   private ControleLogBaixaNgc()
   {
      init(restritores, filtroPropriedade, ControleLogBaixaVo.class);
      addFiltro("estEmpresa.codigo", RestritorHb.RESTRITOR_EQ, "estEmpresaVo.codigo");
      addFiltro("bandeira.codigo", RestritorHb.RESTRITOR_EQ, "bandeiraVo.codigo");
      addFiltro("loteBandeira.codigo", RestritorHb.RESTRITOR_EQ, "loteBandeiraVo.codigo");
      addFiltro("estLoja.codigo", RestritorHb.RESTRITOR_EQ, "estLojaVo.codigo");
      addFiltro("redeAdquirente.codigo", RestritorHb.RESTRITOR_EQ, "redeAdquirenteVo.codigo");
      addFiltro("arquivo.codigo", RestritorHb.RESTRITOR_EQ, "arquivoVo.codigo");
      addFiltro("dataVenda.codigo", RestritorHb.RESTRITOR_GE, "filtro.codigoDataVendaInicial");
      addFiltro("dataVenda.codigo", RestritorHb.RESTRITOR_LE, "filtro.codigoDataVendaFinal");
      addFiltro("dataPagamento.codigo", RestritorHb.RESTRITOR_GE, "filtro.codigoDataPagamentoInicial");
      addFiltro("dataPagamento.codigo", RestritorHb.RESTRITOR_LE, "filtro.codigoDataPagamentoFinal");
   }

   public static ControleLogBaixaNgc getInstancia()
   {
      if (instancia == null)
      {
         instancia = new ControleLogBaixaNgc();
      }
      return instancia;
   }

   @Override
   protected Criteria montaCriteria(Session sessao, int join)
   {
      Criteria criteria = sessao.createCriteria(ControleLogBaixaVo.class);
      if ((join & JOIN_EST_EMPRESA) != 0)
      {
         criteria.createCriteria("estEmpresaVo", "estEmpresa", Criteria.INNER_JOIN);
      }
      if ((join & JOIN_REDE) != 0)
      {
         criteria.createCriteria("redeAdquirenteVo", "redeAdquirente", Criteria.INNER_JOIN);
      }
      if ((join & JOIN_LOJA) != 0)
      {
         criteria.createCriteria("lojaVo", "loja", Criteria.INNER_JOIN);
         criteria.createCriteria("loja.estLojaVo", "estLoja", Criteria.INNER_JOIN);
         
      }
      if ((join & JOIN_ARQUIVO) != 0)
      {
         criteria.createCriteria("arquivoVo", "arquivo", Criteria.INNER_JOIN);
      }
      if ((join & JOIN_BANDEIRA) != 0)
      {
         criteria.createCriteria("bandeiraVo", "bandeira", Criteria.LEFT_JOIN);
      }
      if ((join & JOIN_LOTE_BANDEIRA) != 0)
      {
         criteria.createCriteria("loteBandeiraVo", "loteBandeira", Criteria.LEFT_JOIN);
      }
      if ((join & JOIN_DATA_VENDA) != 0)
      {
         criteria.createCriteria("dataVendaVo", "dataVenda", Criteria.LEFT_JOIN);
      }
      if ((join & JOIN_DATA_PAGAMENTO) != 0)
      {
         criteria.createCriteria("dataPagamentoVo", "dataPagamento", Criteria.LEFT_JOIN);
      }
      return criteria;
   }

   @Override
   protected void setarOrdenacao(Criteria criteria, ControleLogBaixaVo filter, int join)
   {
      if ((join & JOIN_EST_EMPRESA) != 0)
      {
         criteria.addOrder(Order.asc("estEmpresa.descricao"));
      }
      if ((join & JOIN_REDE) != 0)
      {
         criteria.addOrder(Order.asc("redeAdquirente.descricao"));
      }
      if ((join & JOIN_LOJA) != 0)
      {
         criteria.addOrder(Order.asc("estLoja.descricao"));
      }
      criteria.addOrder(Order.desc("valorDiferenca"));
   }

   @Override
   protected void addFiltroValidacao(Session sessao, ControleLogBaixaVo vo) throws R2Exception
   {
      try
      {
         setFiltroPeriodos(sessao, vo);
      }
      catch (Exception e)
      {
         throw new R2Exception(e);
      }
   }
   
   private void setFiltroPeriodos(Session sessao, ControleLogBaixaVo filter) throws Exception
   {
      setFiltroPeriodoDataVenda(sessao, filter);
      setFiltroPeriodoDataPagamento(sessao, filter);
   }
   
   private void setFiltroPeriodoDataVenda(Session sessao, ControleLogBaixaVo filter) throws Exception
   {
      DatasVo vo = new DatasVo();
      DatasVo retornoVo = null;
      
      if (filter.getFiltro().getDataVendaInicial() != null && filter.getFiltro().getDataVendaInicial().isPreenchido())
      {
         vo.setData(filter.getFiltro().getDataVendaInicial());
   
         retornoVo = DatasNgc.getInstancia().get(sessao, vo, 0);
   
         if (retornoVo != null)
         {
            filter.getFiltro().setCodigoDataVendaInicial(retornoVo.getCodigo());
            // filter.getFiltro().setDataVendaInicial(null);
         }
      }

      if (filter.getFiltro().getDataVendaFinal() != null && filter.getFiltro().getDataVendaFinal().isPreenchido())
      {
         vo = new DatasVo();
         vo.setData(filter.getFiltro().getDataVendaFinal());

         retornoVo = DatasNgc.getInstancia().get(sessao, vo, 0);

         if (retornoVo != null)
         {
            filter.getFiltro().setCodigoDataVendaFinal(retornoVo.getCodigo());
            // filter.getFiltro().setDataVendaFinal(null);
         }
      }
   }

   private void setFiltroPeriodoDataPagamento(Session sessao, ControleLogBaixaVo filter) throws Exception
   {
      DatasVo vo = new DatasVo();
      DatasVo retornoVo = null;
      
      if (filter.getFiltro().getDataPagamentoInicial() != null && filter.getFiltro().getDataPagamentoInicial().isPreenchido())
      {
         vo.setData(filter.getFiltro().getDataPagamentoInicial());
         
         retornoVo = DatasNgc.getInstancia().get(sessao, vo, 0);
         
         if (retornoVo != null)
         {
            filter.getFiltro().setCodigoDataPagamentoInicial(retornoVo.getCodigo());
            // filter.getFiltro().setDataVendaInicial(null);
         }
      }
      
      if (filter.getFiltro().getDataPagamentoFinal() != null && filter.getFiltro().getDataPagamentoFinal().isPreenchido())
      {
         vo = new DatasVo();
         vo.setData(filter.getFiltro().getDataPagamentoFinal());
         
         retornoVo = DatasNgc.getInstancia().get(sessao, vo, 0);
         
         if (retornoVo != null)
         {
            filter.getFiltro().setCodigoDataPagamentoFinal(retornoVo.getCodigo());
            // filter.getFiltro().setDataVendaFinal(null);
         }
      }
   }
   
   @Override
   protected Map filtroPropriedade()
   {
      return filtroPropriedade;
   }

   @Override
   protected Map restritores()
   {
      return restritores;
   }

}
